/// 异步方法调用异常重试
///
/// [callable] 待被包裹重试的异步方法
/// [retryLimit] 重试的次数
///
Future<T?> retryOnException<T>(
  Future<T?> Function() callable,
  int retryLimit,
) async {
  assert(1 <= retryLimit);
  for (int i = 0; i < retryLimit; i++) {
    try {
      return await callable();
    } catch (e) {
      if (i >= retryLimit - 1) {
        rethrow;
      }
    }
  }
  return null;
}

/// 异步方法调用重试3次
///
/// [callable] 待被包裹重试的异步方法
///
Future<T?> retry3<T>(Future<T> Function() callable) {
  return retryOnException(callable, 3);
}
